// 1.原型链继承 优点父类的方法可以复用  如果属性是引用类型的话 会被共享 子类的原型=父类的实例
function F() { 
  this.name = "iii",
  this.age=[1,2,3]
}
F.prototype.get = ()=>{

}
function Z() {
  
}
Z.prototype = new F()


// 2.构造函数继承 优点引用数据类型不会共享 不能访问父类原型上的方法 通过call方法改变this的指向

function Son (){
  F.call(this)
}

// 3.组合继承 优点父类可以服用  引用数据类型不会被共享 缺点 会调用两次父类的构造函数 性能不太好
function F() { 
  this.name = "iii",
  this.age=[1,2,3]
}
F.prototype.get = ()=>{

}
function Z() {
  F.call(this)
}
Z.prototype = new F()

// 4.寄生组合继承 创建一个新的构造函数 新的构造函数的原型=父类的原型  子类字节new这个新的构造函数就可以了
function F() { 
  this.name = "iii",
  this.age=[1,2,3]
}
F.prototype.get = ()=>{

}
function Z() {
  F.call(this)
}
function M () {
  
}
M.prototype = F.prototype
function Z() {
  F.call(this)
}
Z.prototype = new M()
  

// 5. es6 class的extends继承